#include<pthread.h>
#include<unistd.h>
#include"RingQueue.hpp"

void* consumer(void* args)
{
    RingQueue<int> *rq = static_cast<RingQueue<int> *>(args);
    while(true)
    {
        //消费者一直取数据
        int data = 0;
        rq->Pop(&data);//消费
        std::cout<<"消费了一个数据："<<data <<std::endl;
    }
}

void* productor(void* args)
{
    RingQueue<int> *rq = static_cast<RingQueue<int> *>(args);
    int data=0;
    while(true)
    {
        sleep(1);
        //生产者需要一直放入数据
        rq->Enqueue(data);
        std::cout<<"生产了一个数据："<<data++ << std::endl;
    }
}

int main()
{
    RingQueue<int> *rq = new RingQueue<int>();
    pthread_t c[2],p[3];

    pthread_create(c,nullptr,consumer,(void*)rq);
    pthread_create(c+1,nullptr,consumer,(void*)rq);
    pthread_create(p,nullptr,productor,(void*)rq);
    pthread_create(p+1,nullptr,productor,(void*)rq);
    pthread_create(p+2,nullptr,productor,(void*)rq);

    pthread_join(c[0] , nullptr);
    pthread_join(c[1] , nullptr);
    pthread_join(p[0] , nullptr);
    pthread_join(p[1] , nullptr);
    pthread_join(p[2] , nullptr);

    delete rq;
    return 0;
}